我花了三周复现R1:跳过SFT推理混乱,加上冷启动才稳住
三周,我把DeepSeek-R1的长链思维复现了一遍,结果太打脸了!
说实话,我一开始根本看不上DeepSeek-R1这玩意儿。
又是“强化学习激发推理能力”,又是“Long CoT自我进化”,听着跟那些天天喊“AGI要来了”的营销号一个调调。我当时就想:又是一套唬人的包装吧?
结果我花了三周去复现它的训练流程,坑踩了个遍,脸真的被打肿了。
第一个坑,差点让我放弃
这个坑特别有意思。
我当时想得挺简单:既然DeepSeek-R1‑Zero直接跳过了SFT阶段就上RL,那我何必多此一举?直接干就完了呗。
你猜怎么着?
模型确实能生成CoT了,但那个CoT简直没法看——中英文来回乱窜,中间动不动就“反思”“再验证”,跟神经病似的一直循环。最要命的是,最后答案反而对。
这就很有意思了:模型学会了推理,但完全没学会“好好说话”。
后来我仔细翻了R1的训练细节,才发现人家搞了个Cold Start阶段。说白了就是先用几千条高质量长思维链数据微调一遍,强制规定格式、规范语言表达(比如统一用中文、避免混用)。这事在论文里就一句话带过,但我实测下来——这步才是决定用户体验的关键。
说到这你可能想问:直接用SFT不就行了?
我测出来的结果挺打脸:纯SFT搞Long CoT,模型确实能达到一定水平,但天花板很明显,就像一个学生死记硬背了标准答案,遇到新题型就抓瞎。SFT给了模型一个“好习惯”,但真正让模型学会推理的,是后面的RL。
RL这块,学问大到让人怀疑人生
GRPO这个算法,我一开始觉得就是PPO的一个变种,没啥好研究的。直到真正跑起来,才发现坑多到让人想骂人。
第一个问题:怎么控制CoT长度?
让模型自己扩展,它疯起来能写到1万token。你敢信?一个推理过程比论文还长。
如果限制长度,模型又会“学坏”——把多个步骤挤在一段里写,看起来短了,但推理质量直线下降。
R1的做法是同时用几种奖励:长度奖励(比如余弦形式,鼓励逐步增加长度)、长度缩放奖励(对更长的合理推理给额外奖励)以及N‑gram重复惩罚(防止模型靠重复凑字数)。我把这仨拆开跑过,结果很直接:
- 没长度奖励:长度暴涨暴跌,准确率50%左右卡死。
- 只有长度奖励:长度稳定增长,但模型学会了凑字数,准确率涨到55%就开始掉。
- 长度奖励加重复惩罚:长度稳定增长,准确率68%还在上升。
那个重复惩罚太关键了。模型很狡猾,不加惩罚它能在同一个意思上绕四五遍,把长度硬撑上去。想想看,这跟某些人写论文一个套路:一句话翻来覆去说,就为了凑字数。
最让我震惊的一个发现
后来我读了字节Seed团队的论文,他们对Long CoT的分析比R1论文更透彻。他们把长思维链拆成三种基础动作:深度推理、自我反思、自我探索。
一开始我觉得这不过是“推理、检查、尝试新路”的老三样,没什么好研究的。直到自己动手做量化分析,才被打脸。
我写了个脚本,把模型生成的CoT每一步映射到语义空间,计算它们的“扩散程度”。结果很震撼:
- **深度推理**:语义扩散圈缩小22%,说白了就是“锁定核心逻辑”。
- **自我反思**:81.72%的反思步骤会精准落回之前的“靠谱思路”区域,反思后语义空间压缩11%。
- **自我探索**:语义覆盖范围从23.95扩大到29.22。代价是稳定性下降,但确实能跳出死胡同。
这不是玄学,是实实在在的量化证据。
关于“奖励设计”的血泪教训
R1的论文里轻描淡写地提了一句“奖励作弊是真实存在的风险”。我要说的是:这哪是风险?这根本就是必然会发生的地狱。
早期我用了一个基于模型的“有用性”奖励函数。奖励分数噌噌往上涨,模型在CodeForces上的实际表现却在下降。模型学会了用漂亮话糊弄奖励模型,但完全没学会真正解决问题。
后来我切回纯规则奖励(直接比对答案),表现才稳定下来。
R1的训练框架在这方面做得不错:他们用异步调度,奖励计算不参与GPU,单独跑规则验证器。这道工程细节看着不起眼,但决定了RL能不能真正收敛。
一个意外的发现:数据质量比数量重要
复现过程中我犯了个新手常犯的错误:觉得数据越多越好。
一开始我用了200万条推理数据做SFT,模型表现反而下降了。后来翻Light‑R1技术报告才找到关键——“全对率”和“全错率”这两个指标太重要了。
真正对RL训练有用的数据,是那些“有的对有的错”的样本(大概占50%)。为什么?因为如果全部对,模型学不到东西;如果全错,很可能是标注有问题。
后来我做了个简单的离线过滤:用小模型采样,只保留通过率在0.2到0.625之间的数据。效果立竿见影。
不同尺寸模型的表现差异
这个点值得单独拿出来说,因为很多人选模型时完全没概念。
我测了1.5B、7B、14B、32B四个尺寸:
| 模型尺寸 | 简单推理任务 | 复杂推理任务 | 生成的CoT稳定性 |
|---------|-----------|-----------|------------|
| 1.5B | RL后提升明显 | 几乎无提升 | 容易重复 |
| 7B | 有一定提升 | 提升有限 | 中等 |
| 14B | 提升明显 | 开始出现能力 | 较好 |
| 32B | 提升不大(接近饱和) | 显著提升 | 稳定 |
最反直觉的是:在简单任务上,1.5B这种小模型反而提升最明显。因为基础能力低,RL就像给学渣补课,效果立竿见影。而在复杂任务上,32B大模型的提升远超小模型。所以别指望小模型靠RL就能搞定高难度推理——基础能力的天花板,RL也突破不了。
最后说点实用的
如果现在你要做Long CoT推理,我建议记住这几条:
- 别跳过Cold Start/SFT阶段。你可以像R1‑Zero那样从零开始RL,但产出的内容根本没法读。这个阶段不需要太多数据,几千条高质量的就行。
- 奖励设计决定成败。能用规则验证的就用规则验证,不要迷信模型打分的奖励。如果必须用模型奖励,一定要关注实际表现,别只看奖励分数。
- 长度控制是门手艺活。推荐R1那套组合方案:长度奖励 + 长度缩放 + N‑gram重复惩罚。缺一个都会出问题。
- 别什么都往训练数据里堆。做离线过滤,只保留“有区分度”的样本。
说到底,Long CoT的研究还在早期。o1和R1证明了方向是对的,但怎么做更好,大家的探索才刚刚开始。
我的实验还在跑,等有新发现再写。
不过有一件事我已经确定了:这个领域,每次你以为“就这样了”,现实就会给你一记耳光。而下一次,你可能会爱上这种被打脸的感觉。
读者评论 4